﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Insifo.BE.Gen;
using Insifo.DL.Gen;
using Insifo.DL;

namespace Insifo.BL.Gen
{
    public class BLPeriodoAnual
    {
        //Objeto transaccion
        DLTransactionMng _transaccion = null;

        //Instancias
        DLPeriodoAnual _dl = new DLPeriodoAnual();
        DLPeriodo _dlPeriodo = new DLPeriodo();
        /// <summary>
        /// Método obtiene la lista
        /// </summary>
        /// <returns>Devuelve un DataSet</returns>
        public DataSet Listar(BEPeriodoAnual pbe)
        {
            return _dl.Listar(pbe);
        }

        /// <summary>
        /// Método que obtiene un objeto
        /// </summary>
        /// <returns>Devuelve un Objeto</returns>
        public BEPeriodoAnual Obtener(BEPeriodoAnual pbe)
        {
            //Obtiene el detalle de salida
            BEPeriodoAnual be = new BEPeriodoAnual();
            be = _dl.Obtener(pbe);

            BEPeriodo bePer = new BEPeriodo();
            bePer.IdPeriodoAnual = pbe.IdPeriodoAnual;
            be.Periodos = _dlPeriodo.Listar(bePer);
            
            return be; 
            
        }

                /// <summary>
        /// Método obtiene Datos del Usuario
        /// </summary>
        /// <returns>Devuelve un DataSet</returns>
        /// 
        public BEPeriodoAnual Obtener_X_PeriodoAnual(BEPeriodoAnual pbe)
        {
            //Obtiene el detalle de salida
            BEPeriodoAnual be = new BEPeriodoAnual();
            be = _dl.Obtener_X_PeriodoAnual(pbe);

            BEPeriodo bePer = new BEPeriodo();
            bePer.IdPeriodoAnual = be.IdPeriodoAnual;
            be.Periodos = _dlPeriodo.Listar(bePer);

            return be;

        }
        /// <summary>
        /// Método que inserta un objeto
        /// </summary>
        /// <returns>Devuelve un Objeto</returns>
        public BEPeriodoAnual Insertar(BEPeriodoAnual pbe)
        {
            BEPeriodoAnual bePer = null;
            _transaccion = DLTransactionMng.Begin();
             try
            {
                _dl.Transaction = _transaccion;
                _dlPeriodo.Transaction = _transaccion;
                bePer = _dl.Insertar(pbe);
                //Insertar los periodos 
                if (pbe.Periodos != null)
                {
                    foreach (BEPeriodo be in pbe.Periodos)
                    {
                        be.IdPeriodoAnual = bePer.IdPeriodoAnual;
                        _dlPeriodo.Insertar(be);
                    }
                }
                //Culmina la transaccion
                _transaccion.Commit();
            }
            catch (Exception e)
            {
                //Cancela la transaccion
                _transaccion.RollBack();
                throw e;
            }
            finally
            {
                _transaccion.Dispose();
            }
             return bePer; 
        }

        /// <summary>
        /// Método que actualiza un objeto
        /// </summary>
        /// <returns>Devuelve un Objeto</returns>
        public BEPeriodoAnual Actualizar(BEPeriodoAnual pbe)
        {
            BEPeriodoAnual bePer = null;
            _transaccion = DLTransactionMng.Begin();
            try
            {
                _dl.Transaction = _transaccion;
                _dlPeriodo.Transaction = _transaccion;
                bePer = _dl.Actualizar(pbe);
                //Insertar los periodos 
                if (pbe.Periodos != null)
                {
                    foreach (BEPeriodo be in pbe.Periodos)
                    {
                        _dlPeriodo.Actualizar(be);
                    }
                }
                //Culmina la transaccion
                _transaccion.Commit();
            }
            catch (Exception e)
            {
                //Cancela la transaccion
                _transaccion.RollBack();
                throw e;
            }
            finally
            {
                _transaccion.Dispose();
            }
            return bePer; 
        }

        /// <summary>
        /// Método que elimina logicamente un objeto
        /// </summary>
        /// <returns>Devuelve un Objeto</returns>
        public BEPeriodoAnual Eliminar(BEPeriodoAnual pbe)
        {
            return _dl.Eliminar(pbe);
        }

    }
}
